File information:

VCCC_Gift.asm - source code (Pasmo assembler)
VCCC_Gift.bin - compiled code
VCCC_Gift.tap - compiled code an BASIC loader together in .tap format
VCCC_Gift_result.png - image of code and result
VCCC_Gift_info.txt - this text

Size results:

Size of source code - 284 bytes
Executable file size - 156 bytes
Net file size - 46 bytes

Instructions:

Load into your favorite Zx Spectrum emulator the file VCCC_Gift.tap

Source code with commentary:

offset	equ 11

	org $8000+offset

start
	ld d,b		; On stock ROM on entry BC holds start address
			; and DE holds address after BASIC loader 
			; which in this case is $xx1x.
			; Setting D to B makes it $801x as a base for
			; PO-MSG.
			; A holds lower byte of start address (i.e.
			; offset) which makes it index for PO-MSG.
			; Combining that it'll print text from
			; address bow.
	call $0c0a
			; On entry HL holds $2D2B - return address for USR
			; function - which coincidently is ASCII for +-
			; which we use.
	call one_line	; print line of +-+-+

	call lines	; print block of lines of ! ! !
			; and then +-+-+ using CALL

			; and then print it again...
lines
	push hl		; save '+-'
	ld hl,$2021	; load ' !'
	ld e,8		; 8 times...
lines_1
	call one_line	; one line
	dec e
	jr nz,lines_1
	pop hl		; restore '+-' and
			; print one line

			; print one line of characters:
			; enter+first-8xsecond-first-8xsecond-first
one_line
	ld a,13		; enter
	rst 16
	ld a,l		; first character
	rst 16
	call one_repeat	; eight times second and first using CALL

			; and then again...
one_repeat
	ld b,8
one_rep_1
	ld a,h		; second character
	rst 16
	djnz one_rep_1	; loop
	ld a,l		; first character
	rst 16
	ret
bow
			; AT 0,8 ; \O/
			; top bit of last character set as end-marker
	db $16,$00,$08,$5c,$4f,$2f+$80

    end start